package net.hn.hnms.biz.common.activiti.service;

import net.hn.hnms.biz.common.activiti.params.ProcessParam;
import net.hn.hnms.biz.common.activiti.params.ProcessQueryParam;
import net.hn.hnms.biz.common.activiti.params.TaskParam;
import net.hn.hnms.biz.common.activiti.result.DeployResult;
import net.hn.hnms.biz.common.activiti.result.ProcessHistoryResult;
import net.hn.hnms.biz.common.activiti.result.ProcessTaskResult;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * Created on 2022/8/5.
 *
 * @author ly
 * @desc: 流程服务api
 */
public interface ProcessApiService {

    /**
     * 使用bpmn文件部署流程
     *
     * @param bpmn 流程文件
     * @param png 流程图片
     * @return 部署后返回信息
     */
    DeployResult deployByBpmnFile(MultipartFile bpmn, MultipartFile png);


    /**
     * 手动创建流程
     *
     * @param processParam 流程创建参数
     * @return 部署后返回信息
     */
    DeployResult createWorkFlow(ProcessParam processParam);

    /**
     * 启动工作流
     * @param processQueryParam 流程参数
     * @return 待执行的流程任务信息
     */
    ProcessTaskResult startProcess(ProcessQueryParam processQueryParam);

    /**
     * 开始任务
     *
     * @param taskParam 流程任务参数
     * @return 待执行的流程任务信息
     */
    ProcessTaskResult taskExecute(TaskParam taskParam);


    /**
     * 获得流程任务执行参数
     * @param taskParam 流程任务参数
     * @return 待执行的流程任务信息
     */
    ProcessTaskResult getTaskVariables(TaskParam taskParam);

    /**
     * 撤销流程
     * @param processQueryParam 流程参数
     */
    void deleteProcess(ProcessQueryParam processQueryParam);


    /**
     * 获取流程图像，已执行节点和流程线高亮显示
     *
     * @param processQueryParam 流程参数
     * @return InputStream 流程图像输入流
     */
    InputStream getActivityProcessImage(ProcessQueryParam processQueryParam);

    /**
     * 完成任务
     * @param taskId 流程任务id
     * @param variables 流程变量
     * @param isStartEvent 是否是起始事件
     * @return 流程是否处理完成标记
     */
    Boolean completeTask(@RequestParam("taskId") String taskId, Map<String, Object> variables, boolean isStartEvent);


    /**
     * 终止流程
     *
     * @param processQueryParam 流程参数
     */
    void endProcess(ProcessQueryParam processQueryParam);

    /**
     * 暂停流程
     *
     * @param processQueryParam 流程参数
     */
    void suspendProcess(ProcessQueryParam processQueryParam);

    /**
     * 激活流程
     *
     * @param processQueryParam 流程参数
     */
    void activateProcess(ProcessQueryParam processQueryParam);


    /**
     * 查询流程定义信息
     * @param processName 流程名称
     * @param version 版本
     * @param suspended 是否暂停
     * @return 流程部署信息集合
     */
    List<DeployResult> processDefinitionList(String processName, Integer version, Boolean suspended);

    /**
     * 暂停/失效流程定义
     * @param processDefinitionId 流程定义记录id
     */
    void suspendProcessDefinition(String processDefinitionId);

    /**
     * 激活流程定义
     * @param processDefinitionId 流程定义记录id
     */
    void activateProcessDefinition(String processDefinitionId);

    /**
     * 流程处理记录追踪 (processInstanceId 只能查询正在运行中的流程 businessKey 可以查询运行中或已结束的流程处理记录)
     * @param processQueryParam 流程参数
     * @return List<ProcessHistoryResult>
     */
    List<ProcessHistoryResult> processTrackingList(ProcessQueryParam processQueryParam);
}
